import Fastify from "fastify";
import fs from "fs/promises";
import path from "path";
import { fileURLToPath } from "url";
import { registerPlugins } from "./plugins/index.js";
import "dotenv/config"; // 加载.env文件

const app = Fastify({
  logger: true,
});

const __dirname = path.dirname(fileURLToPath(import.meta.url));

// 自动注册指定目录下的所有路由
async function autoRegisterRoutes(dirPath) {
  const fullDirPath = path.resolve(__dirname, dirPath);
  const files = await fs.readdir(fullDirPath, { withFileTypes: true });

  for (const file of files) {
    if (
      file.isFile() &&
      file.name.endsWith(".js") &&
      !file.name.startsWith(".")
    ) {
      // 在 Windows 上，需要使用 file:// 协议来导入文件
      const filePath = path.join(fullDirPath, file.name);
      // 使用 fileURLToPath 将路径转换为 URL
      const fileUrl = `file://${filePath.replace(/\\/g, "/")}`;
      const routeModule = await import(fileUrl);

      // 假设路由模块默认导出一个注册函数
      if (typeof routeModule.default === "function") {
        // 可以根据文件名自动添加路由前缀
        const routePrefix = `/api/${path.basename(file.name, ".js")}`;

        await app.register(routeModule.default, { prefix: routePrefix });
        app.log.info(`已注册路由: ${routePrefix}`);
      }
    }
  }
}

// 主函数，包含所有异步操作
async function startApp() {
  try {
    await registerPlugins(app);

    // 注册apis目录下的所有路由文件
    await autoRegisterRoutes("./apis");

    // 添加根路由
    app.get("/", async function handler(request, reply) {
      return { hello: "恭喜你", message: "Fastify 服务器启动成功!" };
    });

    const port = process.env.PORT || 3000;
    await app.listen({ port: port });
  } catch (err) {
    app.log.error(err);
    process.exit(1);
  }
}

// 启动应用
startApp();
